/**
 * Classe per la gestió de les metadades Dublin Core (DC). No es farà una gestió
 * CRUD ja que només ens cal la lectura d'aquestes.
 * @author Emili A. Moreno Ruiz
 */

package edu.uoc.tfc.exuoc.controladors;

import edu.uoc.tfc.exuoc.config.Config;
import edu.uoc.tfc.exuoc.errors.LlistatDAOException;

import edu.uoc.tfc.exuoc.model.Usuari;
import edu.uoc.tfc.exuoc.model.Grup;
import edu.uoc.tfc.exuoc.model.MetaDC;
import edu.uoc.tfc.exuoc.errors.NoExisteixException;
import edu.uoc.tfc.exuoc.errors.AfegirDAOException;
import edu.uoc.tfc.exuoc.errors.ExisteixException;
import edu.uoc.tfc.exuoc.errors.BuitException;

import edu.uoc.tfc.exuoc.utils.Eines;
import edu.uoc.tfc.exuoc.utils.seguretat.Encriptar;

import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;
import org.hibernate.HibernateException;

public  class GestorMetadades implements InterfaceGestor {
    private static Integer numMDC=Config.valorNullInt;
    private MDCDAO dao;
    private GestorLogs  log;


     private static GestorMetadades INSTANCE = null;

     private GestorMetadades(){
        dao= new MDCDAO();
        log=GestorLogs .getLogger(this.getClass().getName());
     };

     //Gestor sincornitzat per evitar problemes multithread
     private synchronized static void createInstance() {
         if (INSTANCE == null) {
             INSTANCE = new GestorMetadades();
          }

     }
     public static GestorMetadades getInstance() {
         if (INSTANCE == null) createInstance();
             return INSTANCE;
     }

     //Obre una connexió amb el gestor genèric de la persistència DAO
     @Override
     public void openGestor() throws HibernateException{
         if (this.dao==null) this.dao= new MDCDAO();
     }
     // Mètode que tancarà la sessió oberta un cop ja no calgui
     @Override
     public void  tancar() {
         try{
             dao.tancarConnexio();
             dao=null;
         }catch(HibernateException e){
             log.error("GMD:tancar:Hi ha hagut un error realitzant el tancament "
                     +"amb la base de dades ", e.getLocalizedMessage());
         }catch (NullPointerException e){
             this.log.info("GMD:tancar:Gestor d'usuaris ja tancat");
         }
     }

     @Override
     public GestorLogs  getLog() {
         return log;
     }

     @Override
     public void setLog(GestorLogs  log) {
         this.log = log;
     }

    @Override
    public int num() throws HibernateException, BuitException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int num(String nomCercat) throws HibernateException, BuitException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public MetaDC llegir(Long id) throws NoExisteixException {
        MetaDC    mdc=new MetaDC();
        MetaDC metadc=null;
        mdc.setNom(Config.valorNullStr);
        mdc.setId(Config.valorNull);

        openGestor();
        try {
            metadc=this.llegir(MetaDC.class, id);
            if (metadc.getNom().equals(null)){
                throw new NoExisteixException("MetaDada inexistent, id:"+id);
            }else {
                mdc=metadc;
            }
        }catch(NullPointerException e){
            log.error("GMD:llegir:Valor llegit null per la Metadada amb id: "
                    +id.toString()+"."+e.getMessage());
        }/*catch(BuitException e){
            log.error("Valor buit per l'usuari amb id: "+id);
        }*/catch(HibernateException e){
            log.error("GMD:llegir:No s'ha llegit la metadada amb id: "
                    +id.toString()+"."+e.getLocalizedMessage());

        }
        //Eines.escriu("Quin tenim ? "+usu.getLogin());
        return mdc;
    }

    public MetaDC llegir(Class classe,Long id) {
        //throws HibernateException, NoExisteixException, BuitException {
        MetaDC  mdc=null;

        openGestor();
        try {
            mdc=dao.consulta(classe, id);
        }catch (BuitException e){
            log.error("GMD:Llegir: No s'ha llegit la metadada amb id: "+id);
        }catch (NullPointerException e){
            log.error("GMD:Llegir: Valors nulls. "+e.getLocalizedMessage());
        }

        return mdc;
    }


    @Override
    public Iterator<MetaDC> llistat() throws LlistatDAOException, BuitException {

            return dao.llista();
    }


    @Override
    public Iterator<?> llistat(int ini, int fi) throws LlistatDAOException, BuitException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Iterator<?> llistat(String camp, String pernom, int ini, int fi) throws LlistatDAOException, BuitException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
